Skip to content

Let other modules' package releases pass the Tape Echo browser binding - #562

Merged
repeat98 merged 1 commit into
mainfrom
claude/tapeecho-binding-other-modules
Oct 13, 2026
Merged

repeat98 merged 1 commit into
mainfrom
claude/tapeecho-binding-other-modules

Conversation

@repeat98

Copy link
Copy Markdown
Owner

Problem

The Tape Echo browser-preservation binding accepted only sourceCommit stamping in the shared package files under src/engine/assets. Any module release that changes compiled packages therefore failed modules:check:

Invalid or stale Tape Echo browser preservation binding; full qualification is required

Reproduced locally: clean main passes; main plus one other module's coldfire-packages.json fails. This is what stops #555 (both module-contract and module-paths-windows) and would stop #558, #560 and #561 and every later package-changing release or author update.

Change

publicationInputs in scripts/browser-infrastructure-preservation.mjs now compares the shared package files, module-build.json and analog-bd-composition-proofs.json the way retained evidence already does: other modules' rows, version labels and source-tree identity are ignored. engineAsset and otherModuleIds move to scripts/engine-asset.mjs so both callers share one definition.

Still required to match: every other byte, the module-build.json file hashes, the provenance stamp (the current commit or the validated file's own value) and unambiguous JSON (duplicate keys are rejected; JSON.parse would otherwise keep the last one). A pure provenance stamp still has to match byte for byte.

Verification

  • New tests accept another module's rows, version and source-tree identity, and reject the same release when it also changes a Tape Echo row, the shared payload, a foreign provenance commit, the Tape Echo version label, the compiler identity, or carries a duplicate key. The accept test fails on the old loader. All earlier mutation cases still reject.
  • npm run check -- --base origin/main: all green, 2308 of 2308 tests.
  • Applied to FM Synth 0.1.5: scale quantizer on MIDI tracks (the author's 2.13 quantizer) #555's head in a scratch copy: the Tape Echo step passes. The next failure there is Generated catalog is stale (its src/catalog/module-documents.json was not regenerated). After npm run modules:generate the module check passes there too.

Limits and review

  • This relaxes a preservation guard, so it needs the owner's review.
  • It does not re-run the executed parity proof and is no new hardware evidence. A release that changes shared builder code under src/engine/*.ts etc. still needs the owner's binding refresh with the private OS image.
  • The parity proof's Tape Echo selections do not include other modules; this change rests on the existing retained-evidence rule that other modules' rows are not Tape Echo inputs.
  • Not a module release, so no module-changelogs.json entry; CHANGELOG.md is updated.

After merge, for #555

Merge main into the FM Synth branch (so the fixed scripts apply), run npm run modules:generate and commit src/catalog/module-documents.json. POLY8 + FM Synth stays refused until POLY8's composition is updated in its own release.

🤖 Generated with Claude Code

The binding accepted only sourceCommit stamping in the shared package files, so
any module release that changed compiled packages failed modules:check with
"Invalid or stale Tape Echo browser preservation binding". Clean main passed;
main plus one other module's coldfire-packages.json did not.

publicationInputs now compares the shared package files, module-build.json and
analog-bd-composition-proofs.json the way retained evidence already does:
other modules' rows, version labels and source-tree identity are ignored (the
helpers move to scripts/engine-asset.mjs, shared by both). A pure provenance
stamp still has to match byte for byte. Anything else, the manifest file
hashes, the provenance stamp and duplicate JSON keys are still checked.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@repeat98
repeat98 merged commit 8eabba1 into main Oct 13, 2026
7 checks passed
repeat98 pushed a commit that referenced this pull request Oct 21, 2026
…anel (new module) (#747)

* Stage Quantize Live Rec Toggle as a draft (QUANTIZE LIVE REC on [REC] + [PLAY])

Port of Zac-Kyoti's octabam module quantize-live-rec-toggle
(sambanks/octabam 6e4aeb7, Zac-Kyoti/octatrack-kyoti-fw 77f132f), staged
under sdk/drafts: not in the catalogue, not offered by the site.

- patch_qlrec.s is the author's file, unchanged.
- manifest.py declares the same floating unit and two jmp detours as a
  Linked unit with Detours, with address/length/SHA-256 guards in place of
  the stock bytes the author's declaration carried. The retired engine-frame
  site 0x400522ca is kept as a guard and checked by the gate.
- verify.py: the image against the original OS, the gesture by the keys
  under the ColdFire port beside the original OS, and an emulated power
  cycle. 29 of 29 passed on the module-alone card build.
- A full listing dry run matched native octabam on 130 selections; TESTING.md
  records it and what listing still needs.

Not tested on any unit. Nothing has been tested on an MKII.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: toast reads LIVE REC: QUANTIZED / UNQUANTIZED

The two toast strings are reworded from the author's QUANT LIVE REC ON / OFF.
No instruction changed; the unit grows from 176 to 180 bytes, so the manifest's
reference is now Modwerk's SHA-256, with the author's kept in a comment. The
gate reads the unit's length from the manifest and passes 29 of 29 on a static
native build. Captures, thumbnail, docs and the import record follow.

In the emulator the 21-character UNQUANTIZED toast fits the screen. The new
wording has not been seen on a unit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: record the user's MKII report on OMXATS19

The gesture, live-record start and [REC] release as the user reported them on
the combined test image, which carried the earlier toast wording. A power
cycle, the current wording and a tap after expiry remain untested on a unit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: the tap after the toast expires, as reported on the MKII

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: MKII report on OMXATS21 (wording fits, power cycle)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: redraw an open PERSONALIZE list after a flip

On an MKII the QUANTIZE LIVE REC box stayed stale after a flip by the gesture
until an arrow key was pressed (the author's open item). Stock redraws a
PROJECT menu page only after a key reaches that page, and [REC]/[PLAY] do not.
After a flip the unit now calls the stock redraw routine 0x40064d7c, which
returns at once when the menu is closed.

Unit 180 -> 186 bytes, qlr_recrel at 0x7a. The gate gains a PERSONALIZE-open
part and passes 36 of 36 on a static native build. Not yet run on a unit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: the redraw beside Output Matrix's AUDIO page, in the emulator

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: MKII report on QLRTEST02 (module alone, PERSONALIZE redraw)

The user flashed QLRTEST02 (this module alone at 50f6539) and reported every
walkthrough step passing: the PERSONALIZE box follows each flip, CONTROL >
AUDIO is left alone, the gesture and a power cycle work. The hardware record
in qualification.example.json is filled from that report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: bind the evidence to QLRTEST02; review fixes

- The gate (36 of 36), the captures (same pixels) and the instruction counts
  are re-run on QLRTEST02's MAIN OS, the image tested on the MKII, and every
  record names it in place of the earlier emulator-only build.
- The module record's limitations, highlights and build reason now match the
  MKII report.
- Stale comments corrected, marked MODWERK: the PERSONALIZE open item, the
  register note at the [PLAY] entry, the toast length, and the manifest's
  "nothing has run on an MKII". The source still rebuilds to QLRTEST02's
  MAIN OS byte for byte; import hashes and the native source hash updated.
- verify.py stops with an error outside an octabam root instead of skipping
  every check and exiting 0.
- The user's flip during a PROJECT menu pop-up is recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: hardware reported, pinned to the tested source; comparison re-run blocked

tests.hardwareStatus is now "reported" and tests.evidenceRevision the tested
source commit 50f6539, which the listing contract requires of an attributed
hardware report. TESTING.md records that the native-vs-browser comparison
could not be repeated for the 186-byte unit on current main: listing's shared
composer changes trip the Tape Echo browser-preservation binding.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: what the Tape Echo binding still refuses after #562

Re-run on main 8eabba1: this module's package rows pass the binding now; the
shared code listing changes (requested-modules.ts, compose-os.ts,
build-module-packages.py and the compilerSha256 it changes) are still refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: the private USB package, in the emulator

ABI 7 package from this source: install, removal and Undo pass on the beta
base in the emulator. The strict stock-free scan refuses it (two 12-byte runs
coincide with stock), and the catalogue name is too long for a package name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: no 12 bytes repeat stock code (USB stock-free scan)

The strict stock-free scan refused the USB package on two 12-byte runs that
coincide with stock: the flip's store of the setting then its battery copy,
and the checksum call then the redraw call. The flip now writes the shadow
first and reaches the redraw through %a0 (lea; jsr (%a0)): same calls, same
order. Unit 186 -> 188 bytes, qlr_recrel at 0x7c.

New image QLRTEST03 (module alone, every stock effect): gate 36 of 36,
captures pixel-identical, invert paths 25 instructions (static 26). The USB
package passes both strict scans; install, removal and Undo pass on the beta
base in the emulator. Not yet run on a unit: the MKII report stays bound to
QLRTEST02 until a retest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: MKII report over USB for the current source

Package 026464de (source d7526ad) on the user's MKII with the flashed beta
base: trials undone, a kept trial, the gesture, the PERSONALIZE redraw, a
power cycle with the module persisting, and removal, as reported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: listing dry run on current main

0 mismatches of 130 selections for the 188-byte unit; Tape Echo's binding and
the native-metadata size no longer stand in the way. Still needed: a hardware
record the contract accepts for this source, the performance waiver, a short
package name and the base rebuilt with this module's chooser entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quantize Live Rec Toggle draft: listed as Quant Live Rec

The user's choice: the 15-character name its USB package already carries, so
the published package can take its name from the catalogue. The module id,
key and attribution are unchanged; the README credits the author's name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: listed in sdk/octabam/modules, bound to the MKII-tested USB package

- The module folder moves from sdk/drafts to sdk/octabam/modules with its
  catalogue entry, licence component and changelog file.
- tests.qualification binds the USB package 026464de... that ran on the MKII
  (15 October 2026), not the untested card image QLRTEST03.
- Packages built in the isolated toolchain and imported; module:verify
  0 mismatches of 130 with its chooser-metadata entry; the beta base rebuilt for
  that entry; QLR's USB package row in octatrack-module-packages.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: USB package published; standalone recipes name the rebuilt shared assets

- npm run octatrack:module-packages -- --stock OS1.40C: QLR's USB package
  0.1.0-experimental is byte-identical to the one that passed on the MKII
  (026464de…, ABI 7, 356 bytes, module 7d0747d4); 0 bytes shared with the
  stock OS. The base-bound packages now name the rebuilt beta base 2802e05c.
- Tape Echo's and Euclid's standalone recipes: the hashes of the four shared
  asset rows (dsp-packages, descriptor-recipes, menu-recipes, rom-packages)
  are refreshed. Those files changed only in their sourceCommit stamp and the
  new quantize-live-rec-toggle version row (provenance only, as in #645).
  Tape Echo (21b953eb…) and Euclid (649f2670…) package bytes are unchanged.
- modules:generate, modules:pairs --write and licenses:generate write
  nothing new; module:verify 0 mismatches of 130 (46 images match, 84
  refusals match), native comparison record unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: the runtime-package test lists its published USB package

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: packages rebuilt in the isolated toolchain on current main

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: native comparison on current main, 0 mismatches of 130

The branch's old requestedCaves change (no overflow fallback for Recorder Loop
Fix's floating cave) mirrored native before #682; since #682 native places that
cave in the overflow run as main's browser composer does, so main's version is
restored and two refusals that differed only in their reason match again. Only
the LATE_ROM ordering for this module's ROM unit remains.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: beta base and USB package rows on current main

- npm run octatrack:base with the beta flags (--usb-midi --usb-audio
  'USB AUDIO OUT TRACKS MAIN CUE' --site-events --table-owners
  --resident-stock-hooks --resident-on-demand --controllers, no
  --cached-modules) --write: main's 6650236a rebuilt byte for byte first;
  with this module's chooser-metadata entry the base is 24b25c39. Only
  base-binding.json's identity moved (lease symbols unchanged, so Analog BD's
  recipe stands); stock-free scan, browser .bin = build_core.py .bin and the
  flash-safety check passed.
- Base-bound packages relinked for 24b25c39: Sidechain Compressor, Output
  Matrix, CC Map, Recorder Loop Fix and Analog BD keep their bytes; only
  requiredBase changes.
- Quant Live Rec's USB package row: 026464de... (356 bytes, ABI 7, module
  7d0747d4), byte-identical to the package that passed on the MKII; no stock
  run of 12 bytes, no check_stock_free hit.
- Tape Echo's and Euclid's standalone recipes: the four shared asset hashes
  (dsp-packages, descriptor-recipes, menu-recipes, rom-packages) follow the
  rebuilt packages, which changed only in provenance and this module's version
  row; Tape Echo (21b953eb) and Euclid (649f2670) rebuild to their committed
  bytes.
- analog-bd-composition-proofs.json: moduleSourceTreeSha256 follows
  module-build.json, as main's releases do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: TESTING.md names the listing as it now stands on main

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: emulator load and stress rows, MIDI transport never reaches it

evidence/performance.json now carries ot_emu measurements (not hardware),
taken with Apply Scene's method: CF METER on a stock and a Quant Live Rec
image under the same MIDI flood (about 1,000 messages a second and clock at
240 BPM) and the same keys (hold [REC], [PLAY], [PLAY], release [REC]).
Flood alone: longest frame interrupt 129.3 us stock, 129.2 us with the
module, idle 62.38 % both. With the gesture: 149.6 vs 149.5 us, idle 60.46
vs 60.19 %. 62 s with STOP mid-note, Part changes and 24 gestures (24 flips):
no message missing, nothing stuck, no hang. MIDI START, CONTINUE and STOP
run their own handlers and never enter the [PLAY] key handler 0x40061778 or
the unit. The cycles row stands: 4 to 25 authored instructions per event
over 115 events under the flood. perf:audit and module:doctor pass.

TESTING.md, the manifest's resource text and the changelog limits follow;
hardwareEvidence asks the owner whether the emulator rows stand in. The
evidence file is part of the module's native source hash, so the
qualification hash moves to 403c3e4b (manifest.py, patch_qlrec.s and
verify.py unchanged; the USB package still builds to 026464de), and
module:verify was re-run: 130 selections, 46 built and 84 refused, 0
mismatches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: record the Part reload on the MKII (setting unchanged)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: record the project reload on the MKII (setting unchanged)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Quant Live Rec: record the reloads in the changelog; LATE_ROM comment

The changelog and the qualification's hardware limitations still listed
Part and project reload as untested; TESTING.md records both on the MKII
on 20 October. A private companion module is no longer named. The
LATE_ROM comment in requested-modules.ts now says which modules it holds
and why the others listed after the utilities are absent (their units
go to DRAM or fixed caves). No native source change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant